package Day012_多线程2.demo03_并发包;

import java.util.ArrayList;

/**
 * @author zhangyan
 * @date 2020/4/30 11:09
 */

//  CopyOnWriteArrayList<Integer> list = new CopyOnWriteArrayList<>();
//  保证多线程下集合原子性

//  CopyOnWriteArrayList可以并发操作,边遍历边增删!

public class demo01_CopyOnWriteArrayList {
    public static void main(String[] args) {
        //创建任务对象
        MyRunnable mr = new MyRunnable();
        //创建线程执行任务
        Thread t1 = new Thread(mr);
        t1.start();

        Thread t2 = new Thread(mr);
        t2.start();
        //为保证t1 t2都执行完毕,
        try {
            Thread.sleep(20000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("集合最终元素个数:" + mr.list.size());
    }
}
/*
    元素个数应该是20000,但实际结果可能会小于20000,也可能报异常!

    初始容量是10,集合已经添加9个元素,
    线程1,获取集合大小是9,添加一个元素,集合大小是10,应该扩容
    在线程1 add的同时,线程2,获取集合大小仍然是9,没有扩容,仍然向前一个索引位置添加,会报异常
 */

class MyRunnable implements Runnable{
    ArrayList<Integer> list = new ArrayList<>();

// 使用 CopyOnWriteArrayList<Integer> list = new CopyOnWriteArrayList<>();

    @Override
    public void run() {
        //往集合中添加10000个元素
        for (int i = 0; i < 10000; i++) {
            list.add(i);
        }
        System.out.println("添加完毕");
    }
}